{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这个实例中，我们使用tensorflow来实现一个简单的手写数字识别的网络，并用这个网络来做个\n",
    "简单的识别示例。\n",
    "\n",
    "首先导入一些用到的库。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:50.515650Z",
     "start_time": "2018-06-01T06:32:43.133728Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:39:48.304594Z",
     "start_time": "2018-06-01T04:55:17.674707Z"
    }
   },
   "source": [
    "先来看看数据长什么样子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.075054Z",
     "start_time": "2018-06-01T06:32:50.518290Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "(55000, 784)\n",
      "(55000, 10)\n",
      "(5000, 784)\n",
      "(5000, 10)\n",
      "(10000, 784)\n",
      "(10000, 10)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"./\", one_hot=True)\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T05:49:40.128071Z",
     "start_time": "2018-06-01T05:49:40.123888Z"
    }
   },
   "source": [
    "可以看到images里面有数量不等的图片，每张图片是28x28长度的一个一维向量，\n",
    "所以用的时候需要先给它还原成28x28的二维图片。labels中则是图片对应的数字的值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.695746Z",
     "start_time": "2018-06-01T06:32:51.077167Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcoAAAHRCAYAAADqjfmEAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3dd3hUxfrA8XdSCCWhK0qvoSlFxV5QwILYe0O9KAo2rop69frzcr2WawXERlGx14uKDSvYUBBRBOlFOkjvIWV+fyTMnFmzw2azm00238/z+PjOzuzZ0ZPdOWfmzIzSWgsAACheSqIrAABAeUZDCQCABw0lAAAeNJQAAHjQUAIA4EFDCQCABw0lAAAeFbqhVEpppdR2pdR9EZbvp5TaVvS+1vGuH0qG85l8ojinQ4rKa6VUWrzrh5KprN9RVZEXHFBKaRFpo7VeUJQ+RkQ+DilWQ0TO1Vq/E+59KB+KOZ/1ReQ9EWknIqkiMltEbtVaf+d7H8oP37lRSl0uIi+IyNVa69GB15uLyGIRSdda55VNTRGJ4s6nUipVRIaIyN9EJEtEFojI8VrrTb73VSRJdcWmtf5GRDL3pJVS3UVkvIh8kqg6oVS2SeGXb76IaBE5Q0TGK6X25Qe0YlNK1RGRf4jIrETXBaU2RESOFJEjRGSpiHQUkV0JrVGMVeiu1whcLiJva623J7oiKDmt9S6t9VytdYGIKBHJF5E6IlI3sTVDDDwgIsNFZF2iK4LoFV3wDJLCXoE/dKGZWmsayopAKVVdRM4VkbGJrgtKRyk1QwqvUN8XkdFa67UJrhJKQSl1qIgcIiLPJLouKLUDRSRPRM5VSq1WSs1TSl2X6ErFWlJ1vYY4RwqvVicluiIoHa11J6VUVRE5S0SqJLo+iF7ReNZTInKD1rpAKZXoKqF0GotILRHJFpEWItJGRL5QSs3TWn+W0JrFUNLeUUpht+uLuiI/rQSjqBv2NRG5QynVOdH1QdQGisgMrfXkRFcEMbGz6N//1lrv1FrPEJHXRaR3AusUc0nZUCqlmohIdxF5McFVQeyli0jLRFcCUeshImcVddOtlsKHQB5VSo1IcL0QnRlF/07qG5Jk7Xq9TES+11ovTHRFED2l1OFS+Dc6RQqnh9woIg1E5MdE1gulcoWIVA2k/ycib4vImITUBqWitV6olPpGRO5SSt0ohRexF4jIRYmtWWwla0PZV0QeTnQlUGoZUvhkZEsRyRWR30TkVK31yoTWClELzq0TEVFK7RaRLVrrzQmqEkrvIim80FkvImtF5G6t9ReJrVJsVfSu1xwRmaaUujf4ota6ndb6L1eoSqkrlVKbit5XUEZ1ROSc86m1nqS17qy1ztJa19VaH6e1/npPYc5nhVDsd3QPrXX3kMUG7hGRX4vel9TdeRXUX86n1nqF1vpkrXWm1rql1vrZPXnJ8h2t0CvzAAAQbxX9jhIAgLiioQQAwIOGEgAAD+9Tr71SzmMAM0E+K3grLkuWcE4TJx7nlPOZOHxHk0+4c8odJQAAHjSUAAB40FACAOBBQwkAgAcNJQAAHjSUAAB40FACAOBBQwkAgEeybrMFAEi0lFQTzhvV1cmaddJTJj7t8gEmTvtiWvzrVULcUQIA4EFDCQCABw0lAAAejFECAGIirVkTJz3vgXomXtx9dEjpKiba1MrG9b+IS9VKhTtKAAA8aCgBAPCg6xXlWmqHbBPPGVDHyZt/9tMmLhB3C78UsdvKPbWphYnHPtbbKVdvzOSY1BOorNJaNjfx73fVd/L+2t1qXb3sKBM3+GadifNjV7WY4Y4SAAAPGkoAADzoekXCpTVp7KR/v2c/E792wrMm7ppR4JQrCFznFYibF7wG7F97gYkb3v6KU+q5CceYOG/5isgrDUdK1aombvq1cvKeavSdiVOVPS+zd+9wyt1yUl8T589dICi/VLp9SnX2v+qaeHHP8F2tLT//m5Nu2/93Exfsmh/D2sUed5QAAHjQUAIA4EFDCQCAR4Ubo1x185FOWgVmBVRdbxMb27nv23+yfei46vgpcakbIrfooSNMPOeSJ5284FSP4DSPgpDrug931DLxlG0tw37WwTWWmPiczC1O3soJM038QUd3+gn8guOSK163U3A+aPRKccVFRKT7zDNNrB51pxJkLPyl1HVKa97UxHlLlpb6eCje3BGdTby456iw5VpPvMLEbfr+7OSFPlVQnnFHCQCABw0lAAAeMel6XXud2x26qVOuicedOCIWH2G0rzI1bN4unWfiWinVnLy1l2038crh7n/2Y6t7mXj9+TVNnLdsedT1hN95veyUgdBVddypHvZa7slNrZxyn53U0cS+qR3fnXahiU9/5mknLzh15APp5q80HAv+ZTfindPtybDl2nxxlYnbDphr4oLtS5xy7l9BZOaNdM/Zeyc+YeILXrjZyWv6r++j+ASIiCwYerib7vNUIGW/oy0/c6eAZPefZeJozm95wR0lAAAeNJQAAHjQUAIA4BH1GOW8UXZsYE7vYU5ehkoPpqL9iBJzP9e1b2qNQOzmvdjsaxNf+kZ3E2+8uKlTjsfNS+nQA014bT07Vvjhjv2cYsGpHjO3NDRxzuB9nHILH7InMvve6k5e/my7JFZwOlD6s+7Jzw0MnKy43R1rb/RfxrSC9BGdnfTXFz8cSNn//0vz3KXpsvvZKTgFubtLXY/cngebeFwv9xmIjoGl1VA6u0+2v/Hjzhzq5KUqOzXImQJy5a9OOV1QHvcCKTnuKAEA8KChBADAI+qu16ePf9HEoV2e/13fxsRrd2dFdfz/TbPdK03HK0/JyCzvYa8JHur9qpMXXK3l5eYTTXzpq92dchsvsLtcMHUkClN+M2H/cwaYOHXVBqeYO9VjtYlW3O6uvjP7ODsV4JRRVzt5qbNtvL6fXQUoV09zygWnojR75Q+3HqH1r+TW3O52m+6bartbd2qb13fQLU656rk/xrQe2/5uv68HVnF/e7bpHBO3eGu9k5ccnYBlp95di03cqUpVJ6/X7NNMnH2PPR/5SdLVGoo7SgAAPGgoAQDwiLrrdegF55r4n11qOnn7vmtX38hf73arRSpbwq/AE43W4208+rneTt7q1+0qMdfVXmbiYDesiEjb/ra7sPnddL2Whp5qu2Ej7eKsus5d22Pk5uYmrrJmm5O3aIh9gvWFy2wXbXCRdRGRaTn2WpGNm/36Z38bNu+sueeZuPq48F2tKs3+5Khq1cKWC5V/oO12f7z982HLdZ92pYn3nTUn4uPjr25s9HnYvC1j7TBU7fmTy6I6CcUdJQAAHjSUAAB40FACAOAR9RilnmZXha/nPnFf7h/DLpjhjl08/3gfE1835OnQ4sarl9oViO68+9DYV6yS2nmG+/9yQzv7Zxkcl6z3mzsO2b/WEhN3+cCd2nFohn1fcArI1Bz32vCf/ey0klRxN5ZF5LLSd5l4e0he7omHmLju3UtM/EbLT0vwCZOKffW7kPO5z4NltxJYMtp8qd0l5NiqdiPto2ac7ZSr/dIPZVan8oA7SgAAPGgoAQDwiMnGzUBprLzAXfFl9nG2+zs4nSN0g+dgXrCrNTQvOAXksrevd8q1/Cr5H22PlZGjTnPS195qFyR/saWdf3Xt9yc75cY0s+czTUJ2JCilK8Zf66TbTK5cXYKxtun00I7zQjvedzcuyNSL4leJlJC/kXKw2g93lAAAeNBQAgDgUSm7Xpff6e47WNB1a0Tva5BquwjzTjjYyUv7clpocUQp+JRq8FrOfd2f13/ZCSZe9g+7SD9drdHb3jj0/79VTdl9IMc2+zIk13al3bLaPuH80YRuTqnc/e33a8GJoyKqU/2fS79hAqz962wp9vVq68Of+2jlnGLP/7qr7R6mBzRY5ZTbeq7928pbtVoSgTtKAAA8aCgBAPCgoQQAwKPCjVGmtWzupBf029/ET104MqJjdK/qrsCSqiK7Xmiclmnikc8Pc/IGNjs6omPgrxq+UcVJn9fITkM4oOZKE19b73unXKPAxsGh13wLH2hv4mpfTYlBLZH97J9Oun3udRG9r/VLdgehgrkLTdwizx0vXvTgERKJgSuOMnHdV91nA3RoYXil7dfASY9q+0oglSmllVq7lonPnDzfybsga7iJa6WE30mm44hLTNz4HMYoAQAod2goAQDwKLddr9vOO8zEfx5k2/N/n/26U+7CrI1RHL301wc9Px/kpLPlp1Ifs7Kq9p7bNZrzno2nBc5V/24DnHJb77WriHx54BtO3tH/siu0/DqtiYnZnDl6+fMWOukWdywMUzLkfREeP21HZFM9fhrdxcT1c5nuUyrp6U6yaVrpulvXDnSn3p15zUQT96+1MqR0ZBt375NV/GpBZYk7SgAAPGgoAQDwoKEEAMAjoWOUqmtHE9ce4S5b9FFzu+NApNM33t1u+9dn7mwcttwHD3V30qk59qHyy/9td0H4a5+6VWV1eti8yiStifv/OW/Z8rh9lp76m5PODGxScd4kd2eLca0/MvEBV9mpO03/xRhleaU8g5l5gZHOOvNyyqA2lYPe6i7fOXJzQxP7fv9S69cz8bK/tTXxb4OeimHtCm3eWdXE+8b86JHhjhIAAA8aSgAAPMq06/WPIe6jw3dfaB/pvyRrvZO3NM+uJj9ndx0T3/DaVU656qvsI+X7T1xn4vzf54WtRy0Jv7nr/H8EVqoI6XpYnLvNxM3f2yaV1c4z7A4QwWkYIiIf/GG70/c/c3aZ1WnzI02ddMEztjs9t83OMqsHonflRRPC5p23wHatp078OWw5lEz+ps1O+rXldkeP/rXsPK2jbv/RKdftXrtx8/mZX8S0TkP+7OCkG95op4fkxfSTIscdJQAAHjSUAAB4lGnXa+1ua510sLu1x++nO3m5T+xn4uDKLc0l/Eocka4AEqrguK4mPrP2mECOex2xoSCwePcU9wnMZBd8uvWCBz428U9bmjvlyrK7Nbjg8rkPut12KcKGvuVd6j77OOk2GQvCll33dHMTZ0liFsauDHY9bzeZyHk418QP7zc95p+Vq+0vdodJ/Uyc/Q93GC7vj2Ux/+yS4o4SAAAPGkoAADxoKAEA8CjTMcp6/dwpFa1vtrtBtBrsjj2mydIyqZOIyMZsu/LDUVXDXzv0n3mpietL+OknyeiPi+30i+Bj449P7+mUayWxH8swDj3QSZ7y/Ne2TrXd8a2CwDVg+rzIdilA2dp8fCsnfVp1O868Tbur71RdlyuIv5qv2uleP/7Hrj52bNXiSu9dvi4w8SE/XezkVXnbTvtr+ZL9/U/UFBAf7igBAPCgoQQAwKNMu17zVrmPdbcaXD4e817frfib/dm7dzjprKdqFVuuMmj0lV08Of2mVBPf1OVLp9yYG041cb1ZbvdZ2pfTij12aodsJ72yR30TZ55q/0a+OvAFp1xwCkhByDVf9sfX2HjI98V+LhLr8iHvh81bnOuez/TPi//bQWK0+/YyE6uZWSZuMXyWU07n267XfbfOiX/F4oQ7SgAAPGgoAQDwoKEEAMAjoRs3J8pJM7c46XG1nwyk7DJ1l8+63ClX5+Op8axW+RZYsu+oGWeb+MsD33CKXXvHEyYukAInb8jag4s99Om1XnPSXTPs+1IC13Khxwte57V9+zonp8PDdtmr8vi4OUTqpYbfgeeRVSeFvLIpvpWBV4enBzrp5g/YZUV1nv2GRbuMaHnHHSUAAB40lAAAeFTKrtdza85w0tVTMk08L9duElp9RO0yq1NFUvvq3SYe8r7bnXp/A/v/Nlc7WXLvvr+YuEBsZuhOH8GpHmvy7abLT613N/7+dMRRJm4zxl3Zie7Wim13QereCyGu7mvZxcRNxJ1ipUMLJznuKAEA8KChBADAo9J0va4daLvtGqS6T68uzrVP3110/2AT1/84/CbRlVnesuUm/vW0Jk5e6/8W/2SriMjs7qNNfOyM803854aaYd/TeqjtRNVT3c2y63k28UbFNqr5B0764Ef/buJWt/wQWhyIK+4oAQDwoKEEAMCDhhIAAI+kHaNUGRlO+pxr7S4XWwt2O3m9p9gNpJs+y7hXSeQtX+GkW12yIkxJkT5ixy9rysJAHF5lewy9Mrnr9UucdLu+j9k43f3+SoE7hQgoS9xRAgDgQUMJAIBH0na9SoHbaffS+ONN/PGv3Z28pm/yuDlQ1pr9nzvMcfP/HRG2bCumAiGBuKMEAMCDhhIAAA8aSgAAPJJ2jFLnulNAmt/FGAcAoOS4owQAwIOGEgAAD6U1a58AABAOd5QAAHjQUAIA4EFDCQCABw0lAAAeFbqhVEpppdR2pdR9EZbvp5TaVvS+1vGuH0omivPZs+h8Fiilesa7fig5vqPJJYrzOaSovFZKVdh5+xW6oSzSWWt9156EUmqkUmpu0Y/nFcGCWusxWuvMMq8hSiL0fJ6glPpZKbVFKbVIKdV/T57W+vOi87k0ITVFpPiOJpfQ89lFKTVNKbWj6N9d9uRpre8RkY4JqWUMJUNDGepXERkoIj8nuiIoHaVUuoiME5FnRaSWiFwgIo8ppTontGIoLb6jSUIpVUVE3hORl0WkjoiMFZH3il5PGknXUGqtn9RafyEiuxJdF5RaXRGpKSIv6UJTRWS2iHRIbLVQGnxHk0p3KVwKdajWOkdrPVxElIickNBaxVjSNZRIHlrrNSLymohcqZRKVUodISLNROTbxNYMQJGOIjJDuyvXzJAk6G4NqrCDq6g0XhOR0SIyrCg9QGu9LIH1AWBlisjmkNc2i0hWAuoSN9xRotxSSrUTkTdEpK+IVJHCq9TblFKnJrRiAPbYJoXDI0E1RWRrAuoSNzSUKM8OEJG5WusJWusCrfVcEflQRE5JcL0AFJolIp2UUirwWqei15NG0jWUSqkqSqmqUjignK6UqqqUSrr/zkpiuoi0KZoiopRSrUSkjxQ+NYkKiu9oUpkoIvkicqNSKkMpdX3R618mrkqxl4x/nJ+KyE4ROVJERhbFxya0RoiK1nqhiPxNRIaLyBYRmSQi74jImETWC6XGdzRJaK13i8iZUjg8skkKv69nFr2eNCp6Q5kjItOUUvfueUFr3V1rrUL+mSgiopS6Uim1qeh9BYmpMjyKO59vaq0P0Fpnaa0ba61v11oXiIgopXoUnc8GUnhVi/KH72hyKe58TtdaH6y1rqa1PkhrPX1PnlLqHinsAcoRkQq7pyP7UQIA4FHR7ygBAIgrGkoAADy8Cw70SjmPftkE+azgLbX3UiXHOU2ceJxTzmfi8B1NPuHOKXeUAAB40FACAOBBQwkAgAcNJQAAHjSUAAB40FACAOBBQwkAgAcNJQAAHjSUAAB40FACAOBBQwkAgAcNJQAAHjSUAAB4eHcPqcgWv97JSX971NMmvrjvDU5e6lc/l0mdAIS38NHDTXzTyR87eR9ddISJC2bMKbM6IQKH29/axTe5m2/MO26siVtPvMLJa3XxL3GtVixxRwkAgAcNJQAAHknb9aqX1nDS9Y6pZuINbTOcvH2+KpMqIcZyTu1m4g1Xb3Pypnd7JaJjXLv8GBN/+3FnJ6/ls4tMnLdqdTRVhEdao4ZOesQZz5u4V7WdTt7Yw3qbuN6M+NYLe7d60JEmvv/650x8YrXtTrncwBbUww593ckbLu2KPfaaG4500g1ftV3t+es3lLiuscAdJQAAHjSUAAB4JG3Xa43lKmzefhf84aTzn4l3bRAtlV7FxPMe6+rkfXja4yZune52pxdEePxnGn9j33P1105elwP7mrjxOXS9xtrCa5o56dDuViSWyrDfqY3nH+TkfX3royaurqpIaS3/h+1unXrdUCfvzesam3j40HOcvH2emVzqz44Ed5QAAHjQUAIA4EFDCQCAR9KOUfrszEt30qXvYUe8zH2ii4nnnfaUk5ciVU1cIFoi0X9Zdyc9usmksGWHd7GPsz9a7zgTJ+oR9WTT5Kjlia4CPBb9y45Lzuo7IiQ3sl/NZza1NPGzL53q5DWS702cU88+VZCuUp1yl2StMnG3Ox5z8i6Tm00cz/FK7igBAPCgoQQAwCNpu15rnroqbN7md9wVQfaRP8KURFkITgERcbtbZ/UJdvm4XTKr8neY+Nhxtzp5LcftNnHGfDu1I3/deqdc1zcuMfG0bi87eT/vbG5ivTs3TO1RErv6HGriYS2fCMlNFyRWcEpIjQ4bS/z+j3dkOel3bjvRxI0+/D60eIllh/xWvP6PR0x8UtdBttw1U0v9WUHcUQIA4EFDCQCABw0lAAAeSTVGmd/dPs48vuOTTt4vu+34VoNXZjp5kS53hvhYdd0hTnreacGxK3vexmxu6pT739W9TNzmux/CHj/P89k5OeHHxcavsBvSVtu62HMURGpnPXs+D6zCmGSiqTS3CVj4b/sb+vshoVNCiheccrX2HHeMMmNFZGOFzT+0zxR0anaFkzftiDEmDp060iLNThGrOSd+f0/cUQIA4EFDCQCAR3J1vWbYdj9TubtJ5Gq7ckvB1q1lVifs3YD+7znpFLE7vzywvoOJJ5+e7ZRTS36J6PipNWuaePlVBzh5t3X6n4mn73Y74audRHdronyX417DZy3zdaAjWjk93R15fr80su7Wm1YeZeI1p9ouz/z1K6OqR+pXP5u46Vdu3ri5+5v4/My1UR2/tLijBADAg4YSAACPpOp6XXIW7X5FlB9yvRZc4Pyj+7ubOGtJ+CdbJcV9Gi7/uM4m7jPiCxNfW9vt1wl2854698yQg64I/3mISrtrZ0VUbujyXk66yiexXWmlMltzo90keeCAdyN6T7CrVURk8XH2O1uwI/k3CaBlAQDAg4YSAAAPGkoAADySaowyaz+mfSSb6qt3772QuGOSIiIfvzwqovedtaC3iVPO2eHk5Ud0BJTEwAbBMWIVttzcj9s46cbyZ5xqlPxSOrd30g/eaFe66VFtR2hxI7jiTnAKiEh8xyVV145Ounn6z2FKiizIzTFxrUXxm0LEHSUAAB40lAAAeCRV1ysqpvk7G7gv1FpiwudeHG7iB9f0dIpN/KO1iT85dLi4qploc8EuE3f78O9OqXa32OkKBdu3R1plxFmzd92uVrrBo3fMS27Xpa+7NWjquweauNH60m+6HKm5A6o76UMzdJiSIhO225W7qr03JW514o4SAAAPGkoAADwqfNdrSlW7H9nRjcIvYj1q7XGB1LY41gglNfu6Du4L7/xowv1TbRfqsIbfOcVSGtruoIJAV2uo458YbOLsh9wuJPYijb/gSjBt04P//6s65VbkB7oE8+hsLY111xxh4gF1Hg3JtRtGrMrf6eTc/Iddnarp/9aYON5nI61FMxNPOvnxkNzw3+1vN7QOpNbFtlIB3FECAOBBQwkAgAcNJQAAHhV/jLJ2LRM/0fDjsOUmfWs37G0lnl0oUCZyTu1m4mUXuitqpHhWbAlKVYHrPO2ONvaYdbaJGz5Udo+2QyS1wb5OuuvFv5m4ZkrV0OJG93G3mrjNfL6jpbHVDvlJZkpG2HKPrD3efd8xwXG++I35hZp7nd2cOfhcQqiNgaleIiKrh7UycQ3GKAEASAwaSgAAPCp812te8wZ7LyQiTT/JjXNNECqlUzsnvd9IuxHy6CbPmji4UXNhunh3rO7mpP835RATP91rrJM3pu3LJu57vu3Sy3yTLr24q1/HSY5u8kmxxbaEdKNlLea6vax98vkhTrqFTC67D1d2iEWnesoF3Lr8FCdd4+0fw5SMLf4yAQDwoKEEAMCDhhIAAI8KP0a57q5dxb7ee87pTrrKxF9NHH4tepTWuv526awJdz/i5NVypgaEnwJyy6rDTfzxl3YMJftxd4nC7FV2t4BHjr/EyQtu3HzhPXba0AdvuuNniL38GlUiKvdbrrtLxH5DmcZT1vb/LnFLBW6+5DATzzn/yYje8/137nKXZTXVjztKAAA8aCgBAPCo8F2vTx/wSiBlnzFeuaWmU65h3vIyqlHlsvXCw510sLu1VsgqLLNz7RSdx1f3MvHcoR2dcrXe/cXELXfZx9Xd9XtcqZN+ddLt3rzOxL+eN9TE40683imX/ulPnqMiGlmProqo3IDpbnd5Y5kVpiTipdmdc5z0mvGxPX5a40Ymnn9dUyfvx0uDu5qEXz3ota12CmD28xudvLLqOOaOEgAADxpKAAA8KlzXa1pz9/Y9S9kn5VJVellXp9Jb18l9ejXY3Tpue10n7/nzTzVxwS+/mzgr5Mm1aDZTTqnmdvN2PGiJiTMCfxcFaZEtuI6SSWvS2MTZmUvDlrtkSU8TN7tqpZPHVs1l7+jaC5z0u23sUEr+/EURHSO1fRsTz7+8vpM39NznTXxite0h7wzf3Ro09rozTJw2a1pE74k17igBAPCgoQQAwIOGEgAAjwo3RrlrtJvOTrdjU/mBzXsz33Snh6BsBDddvv2r85287F+mxvSzUuvXM3H1ce7Y4xstPwqkGJeMt9W9m5j4/X3fd/KCG2xv3GVX40nZ7T7qr9Ltij46d3esq1iptBltp+gM6d3FybtnHzv96sqay5y81Pftb+hvOxpLJLrUmGTiS7IimxoU6v3tdsWsWz+/0Mlr94OdNhTN8wuxwB0lAAAeNJQAAHhUiK7X1OxWJr6l+fthy1202K72UvP1stnQs7KrP8NdYn5jwU4TT+091Mnr9uwgE7f/vz9MnL9mbdjjpzVqaOLtnRs5eYOGvWbiU6tvdvKCXTRPbrJ/P9W+mRO2HOIjOCTyUbvA93eeW67N2wNtfBMbbJdG3qIlJp4w/Ggnb9AQ+/82dPWsvjXt5uoSjGNgh3a705/cYLuEv/6b3ZQ9+6cpTrny8B3ljhIAAA8aSgAAPGgoAQDwqBBjlLsb1TJxj2o5YcvNe6OtiRtoNoEtC1mvu2NJx7YebOJfBzzh5M3r84yJZ51o9wIZNP+CsMd/pb3dHSZ0PCU4FSV0HCO4+fOcG+xmr2rrr4LYq7rBnoGFeTudvFZp1Yp9z86QMavqq7huj4e6z0120v83oIeJr91nopPXPj22y4AGnw94adgpTl79kcF6zYzp58Yaf5kAAHjQUAIA4FEhul59rl1+jIkbvjbXxOxEkBh159j/889saunkdahqN8/uXooyhf8AACAASURBVNV2m37W8R3PEauGzXlmczMTP/5hHyevzd3TTax20d0ab5lv2elY5+832Mn75R9Pmfg/69qZ+J2RJzjlGo1guKQsLOy2y8R3tL7IzbtiPxOfdLLd1PzR/d0hlo4v2g3QlefHttWr601c//fJ4QuWc9xRAgDgQUMJAICH0lqHzeyVcl74TMTVZwVvxWUl70Se0+Cm2/MfrB223AMHvWvi77e2NvH4CYc55VrcWbG6cuJxTvmOJk4yfkcru3DnlDtKAAA8aCgBAPCgoQQAwKPCTw9BxZG3ZKmJW1y4NGy5kRKcVmJXfGkhFWtMEkBy4I4SAAAPGkoAADxoKAEA8KChBADAg4YSAAAPGkoAADxoKAEA8KChBADAg4YSAAAP7+4hAABUdtxRAgDgQUMJAIAHDSUAAB4VuqFUSmml1Hal1H0Rlu+nlNpW9L7W8a4fSiaK89mz6HwWKKV6xrt+KLkozumQovJaKcXuRuVMZf3NrdANZZHOWuu79iSUUqcppWYWnZzvlVId9uRprcdorTMTU01EKPR8nqCU+lkptUUptUgp1X9Pntb686LzGX7PLpQHoee0i1JqmlJqR9G/u+zJ01rfIyIdE1JLRMqcT6VUfaXUd0qp9UqpTUqpyUqpo/YUTJbf3GRoKA2lVBsReUVErhWR2iIyXkTe58q0YlJKpYvIOBF5VkRqicgFIvKYUqpzQiuGqCmlqojIeyLysojUEZGxIvJe0euoeLaJyN9EZB8pPJ//FZHxyfabm1QNpYicJCLfaK2/1VrnSeFJayQixyW2WohSXRGpKSIv6UJTRWS2iHTwvw3lWHcp3DB+qNY6R2s9XESUiJyQ0FohKlrrXVrruVrrAik8j/lS2GDWTWzNYivZGkpV9E9o+oDEVAelobVeIyKviciVSqlUpdQRItJMRL5NbM1QCh1FZIZ2J3DPELpbKzSl1AwR2SUi74vIaK312gRXKaaSraH8TESOU0p1L+rKuVNEqohI9cRWC6Xwmoj8n4jkiMg3InKX1npZYquEUsgUkc0hr20WkawE1AUxorXuJIW9PxdLEl7IJlVDqbWeIyKXi8gIEVklIvVF5HcRWZ7IeiE6Sql2IvKGiPSVwguejiJym1Lq1IRWDKWxTQp/UINqisjWBNQFMVTUDfuaiNyRbM8RJFVDKSKitX5ba32A1rqeiNwjhV11UxNcLUTnABGZq7WeoLUu0FrPFZEPReSUBNcL0ZslIp2UUsEhkk5FryM5pItIy0RXIpaSrqFUSh1cNJ61jxQ+LTm+6E4TFc90EWlTNEVEKaVaiUgfEfk1wfVC9CZK4QMfNyqlMpRS1xe9/mXiqoRoKaUOV0odrZSqopSqppS6XUQaiMiPia5bLCVdQykiw0Rkk4jMLfr31YmtDqKltV4ohY+eDxeRLSIySUTeEZExiawXoqe13i0iZ0phd/omKTy/Zxa9joonQ0SeFJH1IrJCRHqLyKla65UJrVWMVejdQ5RSu6TwIY/hWuu7Iyh/pYg8LiJVRaSD1npRnKuIEojifPaQwoYzQ0R6a62/inMVUUJRnNN7RORmKTynNbTW+XGuIkqgsv7mVuiGEgCAeEvGrlcAAGKGhhIAAA8aSgAAPLwL1/ZKOY8BzAT5rOAttfdSJcc5TZx4nFPOZ+LwHU0+4c4pd5QAAHjQUAIA4EFDCQCABw0lAAAeNJQAAHjQUAIA4EFDCQCABw0lAAAeNJQAAHjQUAIA4EFDCQCABw0lAAAe3kXRgURIa9bExJsOa2TiVX12O+UGHDTJxIPqzHPyDvj2ShMXLKlh4tZDfnXKFezYEb4e++9n4rxVq/dWbSCp5PU42MTrO2Y4eTv3teu269bbTXx750+dcv1q2e/NJzvcYwwe2c/EDR/6vnSVjTPuKAEA8KChBADAg65XJNzKwUc66buues3EZ2WuDfu+lMB1XoEUOHkzjh5jE0fbsPOum5xyze4J3+WT8Ua+ifOODVsMIiLKbuO3dsARTtaAG941cf9aK6M6/MjNDU387umHm7hgyXKnnM51u+dRMpsvtf9vv3xwuIkzlNtUFEjxW2amiLudY6625XpUc4c5vr3xURMfmXqLiRs/UP66YbmjBADAg4YSAACPCt/1mtK5vYnn3lzNxJd1+dEpd0PdKSbu8ehgJ2+/oeXvVj/ZpXbINnGwq1UkfHfrn/k5TvqPvOomzpd0J++QKrYLLjXQLfjrVcOcct222K7Y/R91/w6OrrvQxBOkZrF1qtRSUk247K7DTPzbtSPCviVH2+7slXnu+awa6LXbN7W6k9evpu1i7TfxbRMP29jaKfdFnwNMnLdkadh6oHhbztxm4nRlz29oV+vSvJ0mvmv56WGP9+OclvZ4Ndxu8W+PetrER55pn0Zf9pj7dKzOcf9OEoE7SgAAPGgoAQDwoKEEAMCjQoxRqgzbZ726/8FO3o932DGnrQW2D/zw1291yn3dxY5lHHfpVCdv7tCYVBMlMOeOTBOHjkkGz+PxP11t4gbDqjrlUif+HPb4666xUxT6DPzaxHfW/8Upl+8Ohzi+3dAqkPozfMFKasXgSMcl80zc+VU7JtzytslOudT2bUw85x9ZTt7ME54xcXCqwk11Frgf9oENP+/ewsnKX7c+bB1RqPnVK0w88BM7J2rmhv2ccnUCs6zy5y2UcLJlQ9i8w575u4nnnWbHK7vccoNTrvH9iX+GhDtKAAA8aCgBAPAot12vKVVtN9ucoZ1MvOA0t4vniU22u+atISebuNWbId062bYbbUarLk6ePs0+l562wz6+nvbFtJJWGxH63zFPB1Lu9drAP+zj5g3P+j2q49d/1p7/L9fapXnuHPFLccWLNfcT+7fVmK5XUWnuz0WVoyLryjzgf7YrrU1Id2tQ/uz5tlxfN++Y/rav76HbR5q4e9Vcp1ywK/aLrAPdg9D1ulf5GzeaePooO3xRe6E7RSN/Xvhhj0ilbi/+Pq1j77lOevP9pf6oUuOOEgAADxpKAAA8aCgBAPAoN2OUKdXdJatWvNrMxAu62UfDH9vYxik34YbjTJz51Q9hjx98hLn6xi1O3qDJE008erV9JHrzF3upNKJ2YBW75Fzo8lhT59nH+rOl9ONKWTPt+OK3u9wpJvVm5YUWN7QKm1UppTZt7KSnHvxaseWe2NTSSbd7xo575YcWjlD9kXZsc9zVh5i4e8PwY54onXqjE/P/tk99d3P1V6RxmJJlhztKAAA8aCgBAPBIaNdrsLt1zqMHOHnB7tZHNrQ18dend3DKpS4u+WPKy65wu297VJtg4g372OO9WLuTUy5/0+YSfxaKd/zMc0z82QFvOnlju4828X3iTuWJVF4Pu4LTPvfabveWae45rH/LYhNvf889hip+b9pKa8kFDcPmbdN2+sDr95/s5NX6PfyQSDQWXdHcxN+Nd3cJOirDbuA9v79b35Z321VndF74LnfER84p3Zz0Fb0mFlvu3bVdQ15J/NQs7igBAPCgoQQAwCOhXa9/XtLZxAtOf9LJ+3CHXTT76zM6mjhv8ZJSf+7uWuH71Gbvst01dLXGT+Yg+6f39NtuV3j/WvNMPO+pQ03c4b+rnHJrTrRPw512/SQnr29tu1h+w7TgyufuKugvthxv4j693cWY86rR95par66Jb7/8zbDl3t5qn1Su9Upsu1pD5c+yK7dcPqG/k7fgdDtkM7uv+5ty6juB5X5+mhmfylVyqTXdDc7XXGR/u68Z5I5tBDfjXhLYCHr9w+5i9lXpegUAoHyjoQQAwIOGEgAAjzIdo0xr5D6ufdvgV028In+Hk/fAPQNNXHNR6cc80lo2N3GfU34MXxBlIrhTxEvDTnHyBtxj8+acERhnOsM9RkrgOq9ACtxMKX5H5ttXH+Gkx39tV3lp99tyJ++ah+zOJRPudsdeKgsV2MXnkqy1npKJUXNOyE/Y6cWXExGZe639b8m+Kk4VSlIpXdxpeSu71zbxlrZ2qs3VR7nPCgyu95XnqHbpq54f3Wzi7PFToqxl/HBHCQCABw0lAAAeZdr1WlDP7b46p4ZdLPnf6w5z8mq+WvLu1uDGsisGHerk3XH1Gya+MDPxjxtXdjvPsOfnmGumxvz4/f7oZeI/b25q4pQZC5xyrXfYvzPWaoneVxvbBVKbElYPlEza/vs56csn2YXQT6q+2sTp4naHpqvUUn/20bfa4bXsN2L/GxBL3FECAOBBQwkAgEe52Y/y9JrTnfQH/W8ycfqO8CukbDjVrujwwZFPmbhVmttV8O52+5RW6/evdfKCq3lM3dAskLPSX2mUyIYr7ROn59/yqYkH1ZkXUjKy67dg90+HJ91VdZrc930gZbsCQ5+N9UlRJSmdnBZd1TyicjNft09FNpDvPSVRnug67nDYWTU2BFJV4vrZzqYDBdHuVFo2uKMEAMCDhhIAAA8aSgAAPMp2eshvc5109pv28eB55z/l5E25x135PxKf7Kxn4jNH/83Ja/rQNBO3a7vFfWNgNY/5U+0YZUvGKEslrVkTJ333nWNNfEr1rSYOXVVnQ77dBPj0GfY8vnjAC0651ul29Z20XaWqarEKNNeRu5rtTnQVEE+r3Klyh0272MRd97UbXX/z5YFOuWprlBRnZwP3eZJ/n/O6ic/JXOfk9b5zook/ku4mzno9vrvPRINfAgAAPGgoAQDwKNvpIdq9LW/9d3uLfeic65y8gt4bpTib1mY56ebv2LjKJ3Z1hyYhj6gHP1nPmOPk/WfdASa+9CS7qO/3t8X38ehklNq2tYkfmPCyk9c23U7nWJpnu1d7vzzYKdf6qT9MXHeFnTrS5yX3b2TOCaNtuZNCuskfD6wcEuWj52NePdnEjZnygCSUv9H9nd3ndJsObhHQQiZLNF56wq649sTz1Z28Lw+0q6VNujqwefubIav+lIOpI9xRAgDgQUMJAIAHDSUAAB7lZgm7+s+G9IE/W3y5fWPwWan16jrprtXtWOm0HS1i8AmV1/x7Mk0cHJMUEfl8px1f/td9N5q4+fPuuQ+3i0fry9xlDs+ZdKqJJ3R8y8k7fKBdAnHfEdGNLza+n3FJn1WBzdZrLi3/e6/UWMAzB2Utb5XdgSTzZDfvlqlHm/ijdu+a+PCrr3fK/aVtSADuKAEA8KChBADAo9x0vZYl3cjtwD21+jYT3/SN3eEiW34qszolixcOfy5s3sM3XWbiuh+Wvjtl4SctbcLtrZGrBo438fsj6gliLyvFdq3n1LRxtTh/bmp7O5Xg0qsnRPy+ZmMXmbj8dxTHTmqdOk5a77arLRVs317W1TE++bqriR+/0A5znHXdV065b56tWmZ1Coc7SgAAPGgoAQDwqJRdryt61Q2bl7YuvQxrknxSA2sgpYRch2WszwktXirNX7BdaS/3dRdgP6raAhN/WD/bxPnr1se0Dskua1bgSdGT3LxMZRelP+ImuyrW7BfjW6dGL9hVmG6uMz9sufZj3ZWcWv45NUzJ5JPWpLGJO7y3wsn74D07vNR0SHyf7FYZ9m9k6eCDnbzber8bWrywTlXWhbzSuNhyZYk7SgAAPGgoAQDwoKEEAMCjUo5R5tTRey+EqLy8/kgTd234rZO35O82bvlABxMX/PJ7VJ+l8+yuApvz3Z0J2lex14Brz7JjlPVGRT4tZeuFh5u4PG4mWxaavL7EJm4OX+7A6navidmyX8zrsehBO672ZqPHAjkZTrlRm+1YdevHFzh5+XmVZ1LI5kMbmfjBBu87eXde9Z2JD67/dyev7eiQTe0jsOi82ibOreNuwn5vz7dNfH6mOx6aInbz5+C7nrr3XKdcLUn8d487SgAAPGgoAQDwqJRdr4ifTz8/yCb6ul2vM44eY+KV79mpIo+u7eGU+/ibrhKJcWcPNXHoAuzTc+w14D6v/Gpit2PI79x/fmriCa/XLME7k4cOrNwybGNrJ++mOrZr86KspSa+78XeTrm2j9jF0wtCNk0PZ9t5hznp6Zc+buJqgWkpwa5WEZH3z7Fd//l/hp86kuxqrNhp4uDG9CIi/6w/08Rzz37KyUs5O9gdGpzqpZxywTzn/RGWExFZG1hU/6j3bjFx9tvu5gflYaCMO0oAADxoKAEA8KChBADAgzFKEUlV9nqhzqwEViQJtB660MQ/XuAuB3hYRq6JG6fZPSYeDZlG8ugFbjqcFLHHLwgZffx4ayebt2OHRGPU7KNM3FR+i+oYFV3+ps0m/qKPO9YlH9gwOF45v8dop9hLh9rpIv993X30P+iSs7+0ca1HnbxqqnpocREReeLlM5x049lsti0iIj/MMOHXNx/hZJ34DzvW/L92bzh5wWUJQ8cbg9ypHXYU8ZWt7s5M52ba5QY7fjLQyWs2zh6jzYc/mrg8jEmG4o4SAAAPGkoAADzoehWRfG277erM3uYpib3JX7PWxA+efI6TN3fgPibu3+MLEw+qG93KPP2WHm/iqRPcbsGWY5YGUsslGk3Pq5zdreHkLVnqpF8dFthO5KZAWMddEeeyrNU2vnpEhJ/mdrW+sKWhid859zgTN579o8Av7Ytp7gv2qyenn3aTk7XyIrup85Rj7NSRc+de6JRb94Hd0UMFRj0avuJO/xnb2XaNZ3/5U8R1Lm+4owQAwIOGEgAAD7pexX3qFbGTP2+hk249yKa/lBqBuFuUn2AXcG4q7tOOlWf568QJLjD/6Qv1Tfx58y5OuTnX2ychjz7UdrN/O6WDhNNu5EYnXTBvsYl17tySVxbFqjp+ipNuOd7GF4pd5ShN3G73/ULSe+SHpNO+3FCq+pUXtBAAAHjQUAIA4EFDCQCAB2OUIrIw104JSd1kV3EJ7W8HUDyda6cV5M9f5OS1ucmm1wRf92zIy3cP5Ql3lAAAeNBQAgDgUSm7Xpv/c7KTHvjPowMpd0oDAKBy444SAAAPGkoAADxoKAEA8KChBADAg4YSAAAPGkoAADyU1jrRdQAAoNzijhIAAA8aSgAAPGgoAQDwoKEEAMCjQjeUSimtlNqulLovwvL9lFLbit7XOt71Q8lwPpMP5zS5RHE+hxSV10qpCru2eIV+6lUppUWkjdZ6QeC1kSJynIi0EZG/aa1fiOR9SLzQ86KUyhaRh0XkSBFJFZGpInKj1nqu730oP4o5p8eIyMchxWqIyLla63fCvQ/lQ5jf3C4iMkZE2ovIbBHpp7X+JZDfXEQWi0i61jqvTCscIxX6jjKMX0VkoIj8nOiKoNRqi8j7ItJWRBqIyBQReS+hNUKpaK2/0Vpn7vlHRPqIyDYR+STBVUMUlFJVpPA7+bKI1BGRsSLyXtHrSSPpGkqt9ZNa6y9EZFei64LS0VpP0VqP0Vpv0FrnisjjItJWKVUv0XVDzFwuIm9rrbcnuiKISncp3K5xqNY6R2s9XESUiJyQ0FrFWNI1lEhqx4rIaq31+kRXBKWnlKouIudK4V0IKqaOIjJDu2N4M4peTxo0lKgQlFKNReRJEbk50XVBzJwjIutEZFKiK4KoZYrI5pDXNotIVgLqEjc0lCj3lFL7iMinIvKU1vq1RNcHMXO5iLyoK/IThdgmIjVDXqspIlsTUJe4oaFEuaaUqiOFjeT7WuuIHklH+aeUaiKF41svJrgqKJ1ZItJJKaUCr3Uqej1pJF1DqZSqopSqKoUDyulKqapKqaT776wMlFI1RWSCiHyntb4j0fVBTF0mIt9rrRcmuiIolYkiki8iNyqlMpRS1xe9/mXiqhR7ydiAfCoiO6Vw7t3IovjYhNYI0TpLRLqJyJVFk9D3/NM00RVDqfUVHuKp8LTWu0XkTCk8n5tE5G8icmbR60mjojeUOSIyTSl1754XtNbdtdYq5J+JIiJKqSuVUpuK3leQmCrDwzmfWuuxReevRnDundZ6qQjns4L4y3dURERr3U5rPSa0MOe03CvuN3e61vpgrXU1rfVBWuvpe/KUUvdI4dz2HBGpsGPRFXplHgAA4q2i31ECABBXNJQAAHh4V3PvlXIe/bIJ8lnBW2rvpUqOc5o48TinnM/E4TuafMKdU+4oAQDwoKEEAMCDhhIAAA8aSgAAPGgoAQDwoKEEAMCDhhIAAA8aSgAAPGgoAQDwoKEEAMCDhhIAAA8aSgAAPGgoAQDw8O4eUtHMH3uQief2HOXknXD9QBNXH/djmdUJACqL1I5tnfSSs+uZ+JDeM528F5t9beJcnR/R8XtcN8BJV3t3SkmrGBXuKAEA8KChBADAI6m6XkXbPTcLpMDJWtHDxm3GlVWFEJTWopmJl53VyMRbs/Occm2zV5h4fNv3TZz9wbVOucYT7HVezemrnTy9bYeJ8//808Qqzf2TX3njoSbOq+bWt+kj0+zxcnIEwF9tufhwE596x0Qnb1y938K+L1fb72/o73U4Tw8d5qQHz+1r4vzZ8yM6RjS4owQAwIOGEgAAj+TqevVo1X6liVVGhpNHt1p8rB50pJP+afATJo60qyVYal6fZ9y8PuGP8cbW/U383N/PMvHKY9w/+d8ud7tygk6beLWJ1Xe/7K2qQNJKqVrVSS/8V1cTz7pshIkj/V5HKzu9ipOefVMdm3dtaOnY4Y4SAAAPGkoAADxoKAEA8Kg0Y5QftXvXxGdk9nLy8hmjjJnU1i1MPPamx0NyS/7nNm7bviY+J3NdxO+7IGuVjUc/ZeKUkGvD4IjK9Bw3L3XzrmLLVSZrbrTjzFsO2eUpGV/pGXYK0cyjnw9brk+jg8uiOpWDstPtgmOSIiK/XTY8kCr9/VaHN28Im/f7+U+EzXvg+LdM/PyhfWzGlPDTUqLBHSUAAB40lAAAeFSarleUjZW97bSM9lXCX4ed8NsFJq5xb82w5dJXbTLxmIa1nbycevZR8YEPveXknZW5du+VFZGZu7WJB98y0MmrPpPF87cfblc4mn3cqLDlgl3a0U4RiPQYwZyXtzSJ6rNQvIJjbBfrov729d9PGF5M6b96e9t+Tvqf39qpWU3ed38Pqr1nFzRvLT+YWHXt6B70/PCfF/yeD29Zw8RZMV4rnTtKAAA8aCgBAPCgoQQAwIMxSsTU0ZdNC5u3Kn+nidf81sDEqaeEP16Dn+w45JpDUt3P6mkfAY90TDLUB1u6mJgNvf+qzcDFJj476ywnb/EVTU2cU8eOHCotUSmov9vEs3s+G7Zcu4/sWHL72xaE5G6M7sMrq8AUEJHQccmRER3itLmnm7jg7n2cvOzvfoq+buUId5QAAHjQUAIA4EHXK2Lqw586m/ih075x8pqmZZp49sUjJCJX2jBduV2vuTo/kHKv+dYFunmPeetWE0887xGn3J31bfdt9/Ovc/Iy3/xBKrv8TZttIhiLSJN7l8f0s7adbzcAlp5u3oJcuzJP+4c32PptpKu1pII7gYSuuBPpNJAfc9JNrE+wG60rWVFc8QqPO0oAADxoKAEA8KDrFTGVPcAuiXFQvX5O3m9HvWDiaFZvyQ15mvL97XbT1mGLezh5KcPqm7jVR7YL9ZgaNzvl5pz2pIlX9sp38rLfLHEVUQqr+uwOmzdkuV3wOn/ewrKoTtLS7VuZ2F3cPLz2X1zjpFuNtN/fFEn+Tc25owQAwIOGEgAADxpKAAA8GKNE3LQc4o45de94XZiS0an902oTV1u0OCQ3NL13B2Yvc9Js51225vcYbeKCkGv4aVPamLi1rC+zOiWjFT1qmTh0I/OgcdvrmrjNiFw3M8YbI/sE6/jXKWI21u4iQzGuAwAACIuGEgAAD7peETf5s+Y66cxZsT1+3t6L/EXb7PArh/w2z90EOFtWhymJeCgQHYjd6UPRLrQOkbQmjZ30yRdPNrFvmtbtX9rN1bOnxHgnZI/ld7vpYB1Dp4hdvsQu4VTnw99N7E70Kj3uKAEA8KChBADAI7m6XgP9M6FPc4U+LYXKI7fnwSae0NbdY29yYHHntk/tcPLo7YuvnWccGvJK+L1M8+vapy4XvWr3ED242VKn3KD9P7PvEfcxyKufu97ETf7zfUmqWqFtOMbtev1Pg3Fhy/aaeb6J2982x8Sx7soMteSNTiZ+rssLEb9v4TPtTFx7y2RPydLhjhIAAA8aSgAAPGgoAQDwSK4xysDSDKGPPQcfK559fysnL/uaDYLkkpKVZeL7R9pxydCx6q+32TEOPT3G81eSTGqDfZ301iNbmHhnXXvNnXL2uoiON7bj0JBXMsKWnXPiMxEds98fvUw87ZMOTl7zx+wuFyXfu6biWn/6jr0XKrJseT0TZ28p+epW0bqt06cmPiQj/Ihov6XHO+l6nywwcTzHUbmjBADAg4YSAACP5Op6jVSVytTxUjmk1qvrpLe9ahd+7poRfmWP5yYdZ+I28mN8KleB5Z54iImz7l7i5I1rOcLEwelYkW/Knb73IkWCXap/3tw0fMEfZpiwqbhTQCrrt/7OLp84ad9C6Nn9fop3dYwtH9shsL41g1ODwtfv9+c6Oul6f8ZvSkgQd5QAAHjQUAIA4EFDCQCAR+Uco0TSWdavnZP+6YBhxZb7z7pOTrr942tMHM1uJMnuj1PsT8SElhOcvFe2NjLxpvzqJn5vZWen3NqvGklxhvd71kn3qGYf8O/280VOXt0+8wKpTf5Kw5Gv3fuhyMeQSy+1tn1WYMEzzZy8WZ2ej6hOHd68wcStR5XNmGQo7igBAPCgoQQAwIOuV1QYwdV2RETWvNLQxO90fjikdBUTDd9ou2UnPHSMU6rWoh9iV8EkVHu2Xe0q+6Nrnbz2g213aP6mzSauIn845RqHpPf49WK3K+7YqvOjrifKh+BOPSIiDe6153Rc0zEhpYu/T/t8p/s9bzvKrpwW711MwuGOEgAADxpKAAA86HpFTK0edKSJq/R0F8d+tMObJi7QkV2j3bfkVBMPafGukxdccSfY1Rrqqwvs6jK1ZtHVWhL1R04OxG5ePLvB0l+uu/dCiLn1Vx1h4nqjI3vCdN7ztru1WaP1Tt6opl+UuA43E5sXwwAAA2hJREFUfHy5k27ze+JXzOKOEgAADxpKAAA8aCgBAPBgjBKlsvWCw530T4OfCFs2uGlyrs6N6PgftbPjkqGbLgd3AtlcsMvJ6/HIYBPvN8vdRQKJE9z8uWF68dNGRETSdlXWvT5i76EZJzrpvkc/H6akSId+dvPyn/a3zxv0v/Ajp9x1tReaOF3ZDbFzdejIdfh7seD3OXvs9SZu84/ErL7jwx0lAAAeNJQAAHhU+K5XlWb/EzJq7E5gTSqnVb3cpcR9ixsHu0qjWZg5dNPl4DH+b3UPJ6/Rp3+aOFGreeCvth7ZwsRnZX4Ykst1ezw0HulukD25m+3yPCzDHQJxpnNcG35qR/DbG+n3OrhClojIqPG2S7jlv342ccjXvFzgLxMAAA8aSgAAPGgoAQDwqPBjlCktmpr4lyOfC1suOH2g4UcV/j87oVLr2eXFLjp4SgJrYj3e8Bsn/dX4TBM/cXR3E+etXiMoH1JCrtOD39G0bYwsx0raF9Oc9K1DBpj4m/uHx/SzluflOOmH1vQy8bIrmjh5LX6300DK47hkEHeUAAB40FACAOBR8fsgN2wy4YEv3mjiQ46d4xRb/nAbE2e+m/jV6Cuy3A52w9179p0Q8+Of/Pu5Jl4zqZHNUG65Oy6xu5FckLXKyTu+2jYTP5ERfmcRJE7oVIIXNx9o4vTPp4UWR4zU/8SuqtO1yU1O3vQBw0p17LOG3eak938suCrWPKmouKMEAMCDhhIAAI8K3/Wav36DiVsEFtNdH1KumpSPpzOTQfoq29199PRLnLxvu74S9n2r8neauNdLdtHy1iOXO+UyVtpu1Ca54RfOfv2ZriZ+o/oRTt6WgxuaOGtLxe3yqUxGzT7KxE3ltwTWJLnlr1lr4ib/Wevknf6fbqU69v6SnBsQcEcJAIAHDSUAAB40lAAAeFT4MUqUvfwFi01ct4+bd7pENsbRXOx4cp6nnLcef/4ZNq/6H8tsuSiPj9hb0TN8XuZHmeEzgQTijhIAAA8aSgAAPOh6BVBmUnbZ5ZUeXX+Ak1f3+cmhxYFygTtKAAA8aCgBAPCgoQQAwIMxSgBlptUtP5h4klRLYE2AyHFHCQCABw0lAAAeSmud6DoAAFBucUcJAIAHDSUAAB40lAAAeNBQAgDgQUMJAIAHDSUAAB7/DxK8xwtogAslAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4, 4, idx + 1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(np.argmax(mnist.train.labels[idx])))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28, 28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来，定义用于训练的网络，首先定义网络的输入。\n",
    "\n",
    "这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和lable数据，另外，定义一个bool类型的变量用于标识当前网络是否正在训练。\n",
    "\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.706044Z",
     "start_time": "2018-06-01T06:32:51.698913Z"
    }
   },
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784], name='x')\n",
    "y = tf.placeholder(\"float\", [None, 10], name='y')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "因为我们输入的是图片展开后的一维向量，所以第一步就需要先把一维向量还原为二维的图片。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.719298Z",
     "start_time": "2018-06-01T06:32:51.707730Z"
    }
   },
   "outputs": [],
   "source": [
    "x_image = tf.reshape(x, [-1, 28, 28, 1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:07:36.530623Z",
     "start_time": "2018-06-01T06:07:36.522665Z"
    }
   },
   "source": [
    "接下来，我们定义第一个卷积层，使用6个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式选择valid，所以输出数据的宽高变为24x24,但是深度已经从原来的1变成了6。\n",
    "本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.764292Z",
     "start_time": "2018-06-01T06:32:51.721295Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('conv1'):\n",
    "    C1 = tf.contrib.slim.conv2d(\n",
    "        x_image, 6, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来进行stride为2的最大池化，池化后，输出深度不变，但是长宽减半，所以输出变成了12x12,深度6."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.774112Z",
     "start_time": "2018-06-01T06:32:51.766784Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool1'):\n",
    "    S2 = tf.contrib.slim.max_pool2d(C1, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:10:16.678485Z",
     "start_time": "2018-06-01T06:10:16.671472Z"
    }
   },
   "source": [
    "接下来，我们定义第二个卷积层，使用16个5X5的卷积核对输入数据进行卷积，\n",
    "padding方式还是选择valid，输出8x8,深度为16，本层卷积的激活函数为relu。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.805912Z",
     "start_time": "2018-06-01T06:32:51.776959Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('conv2'):\n",
    "    C3 = tf.contrib.slim.conv2d(\n",
    "        S2, 16, [5, 5], padding='VALID', activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "再进行一次stride为2的最大池化，输出为4x4,深度16。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.814748Z",
     "start_time": "2018-06-01T06:32:51.807560Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('pool2'):\n",
    "    S4 = tf.contrib.slim.max_pool2d(C3, [2, 2], stride=[2, 2], padding='VALID')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "池化后的数据是3维的，这里做一个拉平的操作，将3维数据展开到1维，然后送入两层全连接，全连接隐层中神经元个数分别为120，84。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.856740Z",
     "start_time": "2018-06-01T06:32:51.817287Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('fc1'):\n",
    "    S4_flat = tf.contrib.slim.flatten(S4)\n",
    "    C5 = tf.contrib.slim.fully_connected(\n",
    "        S4_flat, 120, activation_fn=tf.nn.relu)\n",
    "\n",
    "with tf.name_scope('fc2'):\n",
    "    F6 = tf.contrib.slim.fully_connected(C5, 84, activation_fn=tf.nn.relu)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:17:39.880958Z",
     "start_time": "2018-06-01T06:17:39.869797Z"
    }
   },
   "source": [
    "###### 对特征添加一个0.6的dropout，以40%的概率丢弃特征中的某些数据，\n",
    "这样可以提高网络的推广能力，减少过拟合的可能性。\n",
    "\n",
    "需要注意的是，dropout仅在训练的时候使用，验证的时候，需要关闭dropout，\n",
    "所以验证时候的keep_prob是1.0。\n",
    "\n",
    "dropout的输出最终送入一个隐层为10的全连接层，这个全连接层即为最后的分类器。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:51.913419Z",
     "start_time": "2018-06-01T06:32:51.860766Z"
    }
   },
   "outputs": [],
   "source": [
    "with tf.name_scope('dropout'):\n",
    "    keep_prob = tf.placeholder(name='keep_prob', dtype=tf.float32)\n",
    "    F6_drop = tf.nn.dropout(F6, keep_prob)\n",
    "\n",
    "with tf.name_scope('fc3'):\n",
    "    logits = tf.contrib.slim.fully_connected(F6_drop, 10, activation_fn=None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits,\n",
    "这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为0.3。\n",
    "\n",
    ">试试看，增大减小学习率，换个优化器再进行训练会发生什么。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.084738Z",
     "start_time": "2018-06-01T06:32:51.915376Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Conv/weights:0\n",
      "INFO:tensorflow:Summary name Conv/weights:0 is illegal; using Conv/weights_0 instead.\n",
      "Conv/biases:0\n",
      "INFO:tensorflow:Summary name Conv/biases:0 is illegal; using Conv/biases_0 instead.\n",
      "Conv_1/weights:0\n",
      "INFO:tensorflow:Summary name Conv_1/weights:0 is illegal; using Conv_1/weights_0 instead.\n",
      "Conv_1/biases:0\n",
      "INFO:tensorflow:Summary name Conv_1/biases:0 is illegal; using Conv_1/biases_0 instead.\n",
      "fully_connected/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected/weights:0 is illegal; using fully_connected/weights_0 instead.\n",
      "fully_connected/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected/biases:0 is illegal; using fully_connected/biases_0 instead.\n",
      "fully_connected_1/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/weights:0 is illegal; using fully_connected_1/weights_0 instead.\n",
      "fully_connected_1/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_1/biases:0 is illegal; using fully_connected_1/biases_0 instead.\n",
      "fully_connected_2/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/weights:0 is illegal; using fully_connected_2/weights_0 instead.\n",
      "fully_connected_2/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_2/biases:0 is illegal; using fully_connected_2/biases_0 instead.\n",
      "Conv_2/weights:0\n",
      "INFO:tensorflow:Summary name Conv_2/weights:0 is illegal; using Conv_2/weights_0 instead.\n",
      "Conv_2/biases:0\n",
      "INFO:tensorflow:Summary name Conv_2/biases:0 is illegal; using Conv_2/biases_0 instead.\n",
      "Conv_3/weights:0\n",
      "INFO:tensorflow:Summary name Conv_3/weights:0 is illegal; using Conv_3/weights_0 instead.\n",
      "Conv_3/biases:0\n",
      "INFO:tensorflow:Summary name Conv_3/biases:0 is illegal; using Conv_3/biases_0 instead.\n",
      "fully_connected_3/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_3/weights:0 is illegal; using fully_connected_3/weights_0 instead.\n",
      "fully_connected_3/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_3/biases:0 is illegal; using fully_connected_3/biases_0 instead.\n",
      "fully_connected_4/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_4/weights:0 is illegal; using fully_connected_4/weights_0 instead.\n",
      "fully_connected_4/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_4/biases:0 is illegal; using fully_connected_4/biases_0 instead.\n",
      "fully_connected_5/weights:0\n",
      "INFO:tensorflow:Summary name fully_connected_5/weights:0 is illegal; using fully_connected_5/weights_0 instead.\n",
      "fully_connected_5/biases:0\n",
      "INFO:tensorflow:Summary name fully_connected_5/biases:0 is illegal; using fully_connected_5/biases_0 instead.\n"
     ]
    }
   ],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "l2_loss = tf.add_n([\n",
    "    tf.nn.l2_loss(w)\n",
    "    for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)\n",
    "])\n",
    "\n",
    "for w in tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES):\n",
    "    print(w.name)\n",
    "    tf.summary.histogram(w.name, w)\n",
    "    \n",
    "total_loss = cross_entropy_loss + 7e-5 * l2_loss\n",
    "tf.summary.scalar('cross_entropy_loss', cross_entropy_loss)\n",
    "tf.summary.scalar('l2_loss', l2_loss)\n",
    "tf.summary.scalar('total_loss', total_loss)\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=0.3).minimize(total_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:25:56.449132Z",
     "start_time": "2018-06-01T06:25:56.438340Z"
    }
   },
   "source": [
    "需要注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布，\n",
    "要想看到概率分布，还需要做一下softmax。\n",
    "\n",
    "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:39:50.010829Z",
     "start_time": "2018-06-01T06:39:49.997501Z"
    }
   },
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(y, 1), tf.argmax(logits, 1))\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "saver用于保存或恢复训练的模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:32:52.127795Z",
     "start_time": "2018-06-01T06:32:52.103115Z"
    }
   },
   "outputs": [],
   "source": [
    "batch_size = 100\n",
    "trainig_step = 1100\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:35:22.270272Z",
     "start_time": "2018-06-01T06:33:18.829198Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "ename": "InvalidArgumentError",
     "evalue": "You must feed a value for placeholder tensor 'x' with dtype float and shape [?,784]\n\t [[node x (defined at D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\framework\\ops.py:1748) ]]\n\nOriginal stack trace for 'x':\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\runpy.py\", line 193, in _run_module_as_main\n    \"__main__\", mod_spec)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\runpy.py\", line 85, in _run_code\n    exec(code, run_globals)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\ipykernel_launcher.py\", line 16, in <module>\n    app.launch_new_instance()\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\traitlets\\config\\application.py\", line 664, in launch_instance\n    app.start()\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\ipykernel\\kernelapp.py\", line 563, in start\n    self.io_loop.start()\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tornado\\platform\\asyncio.py\", line 148, in start\n    self.asyncio_loop.run_forever()\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\asyncio\\base_events.py\", line 534, in run_forever\n    self._run_once()\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\asyncio\\base_events.py\", line 1771, in _run_once\n    handle._run()\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\asyncio\\events.py\", line 88, in _run\n    self._context.run(self._callback, *self._args)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tornado\\ioloop.py\", line 690, in <lambda>\n    lambda f: self._run_callback(functools.partial(callback, future))\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tornado\\ioloop.py\", line 743, in _run_callback\n    ret = callback()\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tornado\\gen.py\", line 787, in inner\n    self.run()\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tornado\\gen.py\", line 748, in run\n    yielded = self.gen.send(value)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\ipykernel\\kernelbase.py\", line 361, in process_one\n    yield gen.maybe_future(dispatch(*args))\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tornado\\gen.py\", line 209, in wrapper\n    yielded = next(result)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\ipykernel\\kernelbase.py\", line 268, in dispatch_shell\n    yield gen.maybe_future(handler(stream, idents, msg))\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tornado\\gen.py\", line 209, in wrapper\n    yielded = next(result)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\ipykernel\\kernelbase.py\", line 541, in execute_request\n    user_expressions, allow_stdin,\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tornado\\gen.py\", line 209, in wrapper\n    yielded = next(result)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\ipykernel\\ipkernel.py\", line 300, in do_execute\n    res = shell.run_cell(code, store_history=store_history, silent=silent)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\ipykernel\\zmqshell.py\", line 536, in run_cell\n    return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 2848, in run_cell\n    raw_cell, store_history, silent, shell_futures)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 2874, in _run_cell\n    return runner(coro)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\IPython\\core\\async_helpers.py\", line 68, in _pseudo_sync_runner\n    coro.send(None)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3051, in run_cell_async\n    interactivity=interactivity, compiler=compiler, result=result)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3242, in run_ast_nodes\n    if (await self.run_code(code, result,  async_=asy)):\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3319, in run_code\n    exec(code_obj, self.user_global_ns, self.user_ns)\n  File \"<ipython-input-4-90d217bf2e60>\", line 1, in <module>\n    x = tf.placeholder(\"float\", [None, 784], name='x')\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\ops\\array_ops.py\", line 2619, in placeholder\n    return gen_array_ops.placeholder(dtype=dtype, shape=shape, name=name)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\ops\\gen_array_ops.py\", line 6668, in placeholder\n    \"Placeholder\", dtype=dtype, shape=shape, name=name)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\framework\\op_def_library.py\", line 794, in _apply_op_helper\n    op_def=op_def)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\util\\deprecation.py\", line 507, in new_func\n    return func(*args, **kwargs)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\framework\\ops.py\", line 3357, in create_op\n    attrs, op_def, compute_device)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\framework\\ops.py\", line 3426, in _create_op_internal\n    op_def=op_def)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\framework\\ops.py\", line 1748, in __init__\n    self._traceback = tf_stack.extract_stack()\n",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mInvalidArgumentError\u001b[0m                      Traceback (most recent call last)",
      "\u001b[1;32m~\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\client\\session.py\u001b[0m in \u001b[0;36m_do_call\u001b[1;34m(self, fn, *args)\u001b[0m\n\u001b[0;32m   1364\u001b[0m     \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1365\u001b[1;33m       \u001b[1;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1366\u001b[0m     \u001b[1;32mexcept\u001b[0m \u001b[0merrors\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mOpError\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\client\\session.py\u001b[0m in \u001b[0;36m_run_fn\u001b[1;34m(feed_dict, fetch_list, target_list, options, run_metadata)\u001b[0m\n\u001b[0;32m   1349\u001b[0m       return self._call_tf_sessionrun(options, feed_dict, fetch_list,\n\u001b[1;32m-> 1350\u001b[1;33m                                       target_list, run_metadata)\n\u001b[0m\u001b[0;32m   1351\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\client\\session.py\u001b[0m in \u001b[0;36m_call_tf_sessionrun\u001b[1;34m(self, options, feed_dict, fetch_list, target_list, run_metadata)\u001b[0m\n\u001b[0;32m   1442\u001b[0m                                             \u001b[0mfetch_list\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtarget_list\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1443\u001b[1;33m                                             run_metadata)\n\u001b[0m\u001b[0;32m   1444\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mInvalidArgumentError\u001b[0m: You must feed a value for placeholder tensor 'x' with dtype float and shape [?,784]\n\t [[{{node x}}]]",
      "\nDuring handling of the above exception, another exception occurred:\n",
      "\u001b[1;31mInvalidArgumentError\u001b[0m                      Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-36-cda72143e4fc>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m     21\u001b[0m                 \u001b[0mx\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mxs\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     22\u001b[0m                 \u001b[0my\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mys\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 23\u001b[1;33m                 \u001b[0mkeep_prob\u001b[0m\u001b[1;33m:\u001b[0m \u001b[1;36m0.6\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     24\u001b[0m             })\n\u001b[0;32m     25\u001b[0m         \u001b[0mwriter\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0madd_summary\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mi\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\client\\session.py\u001b[0m in \u001b[0;36mrun\u001b[1;34m(self, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[0;32m    954\u001b[0m     \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    955\u001b[0m       result = self._run(None, fetches, feed_dict, options_ptr,\n\u001b[1;32m--> 956\u001b[1;33m                          run_metadata_ptr)\n\u001b[0m\u001b[0;32m    957\u001b[0m       \u001b[1;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    958\u001b[0m         \u001b[0mproto_data\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\client\\session.py\u001b[0m in \u001b[0;36m_run\u001b[1;34m(self, handle, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[0;32m   1178\u001b[0m     \u001b[1;32mif\u001b[0m \u001b[0mfinal_fetches\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0mfinal_targets\u001b[0m \u001b[1;32mor\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mhandle\u001b[0m \u001b[1;32mand\u001b[0m \u001b[0mfeed_dict_tensor\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1179\u001b[0m       results = self._do_run(handle, final_targets, final_fetches,\n\u001b[1;32m-> 1180\u001b[1;33m                              feed_dict_tensor, options, run_metadata)\n\u001b[0m\u001b[0;32m   1181\u001b[0m     \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1182\u001b[0m       \u001b[0mresults\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\client\\session.py\u001b[0m in \u001b[0;36m_do_run\u001b[1;34m(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)\u001b[0m\n\u001b[0;32m   1357\u001b[0m     \u001b[1;32mif\u001b[0m \u001b[0mhandle\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1358\u001b[0m       return self._do_call(_run_fn, feeds, fetches, targets, options,\n\u001b[1;32m-> 1359\u001b[1;33m                            run_metadata)\n\u001b[0m\u001b[0;32m   1360\u001b[0m     \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1361\u001b[0m       \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_do_call\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0m_prun_fn\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfeeds\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfetches\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\client\\session.py\u001b[0m in \u001b[0;36m_do_call\u001b[1;34m(self, fn, *args)\u001b[0m\n\u001b[0;32m   1382\u001b[0m                     \u001b[1;34m'\\nsession_config.graph_options.rewrite_options.'\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1383\u001b[0m                     'disable_meta_optimizer = True')\n\u001b[1;32m-> 1384\u001b[1;33m       \u001b[1;32mraise\u001b[0m \u001b[0mtype\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0me\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnode_def\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mop\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmessage\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1385\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1386\u001b[0m   \u001b[1;32mdef\u001b[0m \u001b[0m_extend_graph\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mInvalidArgumentError\u001b[0m: You must feed a value for placeholder tensor 'x' with dtype float and shape [?,784]\n\t [[node x (defined at D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\framework\\ops.py:1748) ]]\n\nOriginal stack trace for 'x':\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\runpy.py\", line 193, in _run_module_as_main\n    \"__main__\", mod_spec)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\runpy.py\", line 85, in _run_code\n    exec(code, run_globals)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\ipykernel_launcher.py\", line 16, in <module>\n    app.launch_new_instance()\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\traitlets\\config\\application.py\", line 664, in launch_instance\n    app.start()\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\ipykernel\\kernelapp.py\", line 563, in start\n    self.io_loop.start()\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tornado\\platform\\asyncio.py\", line 148, in start\n    self.asyncio_loop.run_forever()\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\asyncio\\base_events.py\", line 534, in run_forever\n    self._run_once()\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\asyncio\\base_events.py\", line 1771, in _run_once\n    handle._run()\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\asyncio\\events.py\", line 88, in _run\n    self._context.run(self._callback, *self._args)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tornado\\ioloop.py\", line 690, in <lambda>\n    lambda f: self._run_callback(functools.partial(callback, future))\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tornado\\ioloop.py\", line 743, in _run_callback\n    ret = callback()\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tornado\\gen.py\", line 787, in inner\n    self.run()\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tornado\\gen.py\", line 748, in run\n    yielded = self.gen.send(value)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\ipykernel\\kernelbase.py\", line 361, in process_one\n    yield gen.maybe_future(dispatch(*args))\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tornado\\gen.py\", line 209, in wrapper\n    yielded = next(result)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\ipykernel\\kernelbase.py\", line 268, in dispatch_shell\n    yield gen.maybe_future(handler(stream, idents, msg))\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tornado\\gen.py\", line 209, in wrapper\n    yielded = next(result)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\ipykernel\\kernelbase.py\", line 541, in execute_request\n    user_expressions, allow_stdin,\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tornado\\gen.py\", line 209, in wrapper\n    yielded = next(result)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\ipykernel\\ipkernel.py\", line 300, in do_execute\n    res = shell.run_cell(code, store_history=store_history, silent=silent)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\ipykernel\\zmqshell.py\", line 536, in run_cell\n    return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 2848, in run_cell\n    raw_cell, store_history, silent, shell_futures)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 2874, in _run_cell\n    return runner(coro)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\IPython\\core\\async_helpers.py\", line 68, in _pseudo_sync_runner\n    coro.send(None)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3051, in run_cell_async\n    interactivity=interactivity, compiler=compiler, result=result)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3242, in run_ast_nodes\n    if (await self.run_code(code, result,  async_=asy)):\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\IPython\\core\\interactiveshell.py\", line 3319, in run_code\n    exec(code_obj, self.user_global_ns, self.user_ns)\n  File \"<ipython-input-4-90d217bf2e60>\", line 1, in <module>\n    x = tf.placeholder(\"float\", [None, 784], name='x')\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\ops\\array_ops.py\", line 2619, in placeholder\n    return gen_array_ops.placeholder(dtype=dtype, shape=shape, name=name)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\ops\\gen_array_ops.py\", line 6668, in placeholder\n    \"Placeholder\", dtype=dtype, shape=shape, name=name)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\framework\\op_def_library.py\", line 794, in _apply_op_helper\n    op_def=op_def)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\util\\deprecation.py\", line 507, in new_func\n    return func(*args, **kwargs)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\framework\\ops.py\", line 3357, in create_op\n    attrs, op_def, compute_device)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\framework\\ops.py\", line 3426, in _create_op_internal\n    op_def=op_def)\n  File \"D:\\Cadence16.6\\Cadence\\SPB_Data\\.conda\\envs\\CSDN3.7\\lib\\site-packages\\tensorflow_core\\python\\framework\\ops.py\", line 1748, in __init__\n    self._traceback = tf_stack.extract_stack()\n"
     ]
    }
   ],
   "source": [
    "merged = tf.summary.merge_all()\n",
    "with tf.Session() as sess:\n",
    "\n",
    "    writer = tf.summary.FileWriter(\"logs/\", sess.graph)\n",
    "\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "        keep_prob: 1.0\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels, keep_prob: 1.0}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss, rs = sess.run(\n",
    "            [optimizer, cross_entropy_loss, merged],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                keep_prob: 0.6\n",
    "            })\n",
    "        writer.add_summary(rs, i)\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-06-01T06:58:16.766415Z",
     "start_time": "2018-06-01T06:58:15.918700Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-1000\n",
      "1.0\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16],\n",
    "                keep_prob: 1.0\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(\n",
    "                np.argmax(mnist.test.labels[idx]), order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "卷积特性描述\n",
    "\n",
    "工作原理\n",
    "用一个小的权重矩阵去覆盖输入数据，对应位置元素加权相乘，求和后的结果作为该卷积核中心点对应的像素卷积操作后的像素值，这个带有权重的卷积核在待处理的二维数据上面按照规律滑动，最后形成一个新的矩阵。这里需要注意的是，如果待进行卷积操作的数据有几个深度，一层深度的卷积核在对每个深度计算完后进行加处理，最后不管待处理的深度多少，出来的结果深度都为1.也就是说，如果卷积核的深度为n，卷积后的深度也是n，不管被卷积的数据的深度为多少。\n",
    "\n",
    "局部相关性\n",
    "*相邻的像素结合起来表达一个特征，距离较远的像素影响较小；\n",
    "\n",
    "*随着层数的增加，feature map里面的点 映射到原图的感受野越来越大\n",
    "不仅仅可以适用于图像，其他具有局部相关性的数据均可以尝试卷积网络处理\n",
    "\n",
    "*带来一定的遮挡不变性\n",
    "\n",
    "*参数共享\n",
    "\n",
    "*平移宽容\n",
    "\n",
    "*在任何位置都可以激活神经元\n",
    "\n",
    "*缩放宽容\n",
    "\n",
    "*在一定程度内的图像缩放（通常认为25%以内）不会产生太大干扰\n",
    "\n",
    "*少许降维：\n",
    "\n",
    "例如：10×10的图像，用5×5的卷积核，采用\"VALID\"方式（padding=0），stride=2，那么输出的feature map大小为： （10-5 + 0*2）/2 + 1 = 3 ，3×3\n",
    "\n",
    "*对输入的尺寸不做要求\n",
    "\n",
    "*全连接里面，权重W的尺寸是由输入决定的\n",
    "\n",
    "*卷积核的尺寸只与网络设计有关，与输入没有任何关系\n",
    "\n",
    "*卷积核固定的情况下，feature的尺寸是随输入变化的"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "为什么卷积的效果要比全连接网络好\n",
    "\n",
    "卷积操作可以自己设计特征检测算子\n",
    "\n",
    "经过多层提取，可以看到整体\n",
    "\n",
    "卷积操作考虑了数据间的局部相关性，空间相关性"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
